//
// Created by zhangyue26 on 2020/7/23.
//
#include <stdio.h>
/**
 * 函数参数作为指针变量
 * 交换地址
 * TODO 特殊，注意只有这个方法才能实现指针交换,变量的交换
 */
void methodPoint1(int *a, int *b) {//指针为入参，中间变量为整型变量(TODO 特殊)
    int tmp;
    tmp = *a;
    *a = *b;
    *b = tmp;
}
/**
 * 这样的情况下的指针交换并不能真正的将指针地址进行交换，
 */
void methodPoint2(int *a, int *b) {
    int * temp;
    temp = a;
    a = b;
    b = temp;
}

/**
 * TODO 数值传递的问题，要想实现值得传递功能，只能使用 methodPoint1 方法
 * TODO 数值交换问题，这里涉及值得传递问题，因为函数调用的过程中，数值传递是单向的，只能把
 * TODO 实参传递给形参，在函数调用过程中，形参的值得改变并不能改变实参的值
 */
void methodPoint3(int a, int b) {
    int temp;
    temp = a ;
    a = b;
    b = a;
}

/**
 * TODO 函数指针嵌套调用,同样的这样也不能实现从到小的排序
 */
void methodPoint4(int *p1, int *p2, int *p3) {
    if (*p1 < *p2) {
        methodPoint2(p1, p2);
    }
    if (*p1 < *p3) {
        methodPoint2(p1, p3);
    }
    if (*p2 < *p3) {
        methodPoint2(p2, p3);
    }
    printf("*p1-a = %d,*p2-b = %d,*p3-c = %d\n", *p1, *p2, *p3);
}

//TODO C语言中的实参变量和形参变量之间的数据传递是单向的‘值传递’方式，
// 指针变量作函数参数也是如此，调用函数不可能改变实参指针变量的值，
// *****但可以改变实参指针变量所只变量的值***** 所以 只有methodPoint1能够实现交换功能

/**
 * 使用指针实现冒泡排序
 */
void methodPointForBubbleSort(int *p, int n) {
    int i,t,j;
    for (int i = 0; i < n - 1; i++) {
        for (int j = 1; j < n - 1 - i; j++) {
            if (*(p + j) > *(p + j + 1)) {//TODO 只有改变指针指向的值才能真正的实现值的交换
                t = *(p + j);
                *(p + j) = *(p + j + 1);
                *(p + j + 1) = t;
            }
        }
    }
    printf("函数内排序得到的值为：\n");
    for (int k = 0; k < n; ++k) {
        printf("%6d", *(p + k));
    }
    printf("\n");
}